#include "TcpServer.hpp"
#include <functional>
#include <memory>
#include <unistd.h>
#include"Protocol.hpp"
#include"Calculator.hpp"
#include"Daemon.hpp"
using namespace LogModule;

using cal_fun = std::function<Response(const Request &req)>;
//package
//报文不完整继续读
//报文完整，解析报文
//提取报文 -》反序列化 -》Request -》计算模块，处理

//将Entry回调函数写入一个类，形成三层结构中的第二层
//1.应用层（计算） 2.表示层（制定协议） 3.会话层，底层IO(服务器与客户端)
class Parse
{
public:
    Parse(cal_fun c):_cal(c)
    {}
    std::string Entry(std::string &package)
    {     
        //1.判断报文完整性，并提取报文
        std::string message;
        std::string respstr;
        //连续处理连续处理完整报文
        while(Decode(package,&message))
        {
            //只处理一个完整的报文

            if(message.empty()) break;

            //2.反序列化，message是序列化后的Request
            Request req;
            if(!req.Deserialize(message)) break;

            //3.计算
            Response resp = _cal(req);

            //4.回显结果，序列化
            std::string res;
            resp.Serialize(res);

            //5.添加报头
            Encode(res);

            //6.拼接Encode后的报文
            respstr += res;
        }
        
        return respstr;
    }
private:
    cal_fun _cal;
};


int main()
{
    //，成为守护进程后，解除显示器的终端连接，向文件中打印
    Enable_File();
    //成为守护进程
    Daemon(false, false);
    //1.应用层，计算模块
    Calculator mycal;
    
    //2.解析对象，表示层
    Parse myparse([&mycal](const Request &req){
        return mycal.Execute(req);
    });

    //3.通信层，会话层，负责IO
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>([&myparse](std::string &package){
        return myparse.Entry(package);
    });

    tsvr->InitServer();
    tsvr->Start();

    return 0;
}